import axios, { type Method } from 'axios'
import { useUserStore } from '@/stores'
import { showToast } from 'vant'
import router from '@/router'
// 请求相关
/*
  1. 创建axios实例
  1.1 配置请求根路径 
  1.2 设置超时时间

  2. 添加请求拦截器
  2.1 统一处理相同的业务 - 比如携带token

  3. 添加响应拦截器
  3.1 数据剥离 
  3.2 响应状态码正确 - 200, 业务状态码错误 - 业务处理失败  (请求成功, 业务处理失败)
  3.3 错误的统一处理 - 比如 token失效 / 状态码401
*/
const baseURL = 'https://consult-api.itheima.net'
const instance = axios.create({
  baseURL, // 基地址
  timeout: 10000 // 超时时间
})
// 添加请求拦截器
instance.interceptors.request.use(
  function (config) {
    // 在发送请求之前做些什么
    // 携带token
    // 1. 判断store仓库中是否有token
    // 1.1 有 - 携带
    const store = useUserStore()
    if (store.user?.token) {
      config.headers.Authorization = `Bearer ${store.user.token}`
    }
    return config
  },
  function (error) {
    // 对请求错误做些什么
    return Promise.reject(error)
  }
)

// 添加响应拦截器
instance.interceptors.response.use(
  function (response) {
    // 对响应数据做点什么
    // 1. 请求成功, 业务失败
    // code 不等于10000 - 属于业务失败
    if (response.data.code !== 10000) {
      showToast(response.data.message || '业务处理失败')
      // 中断代码执行
      return Promise.reject(response.data)
    }
    return response.data
  },
  function (error) {
    // 对响应错误做点什么
    console.dir(error)
    if (error.response.status === 401) {
      // 1. 清除登录状态
      const store = useUserStore()
      store.delUser()
      // 2. 回到登录页 ---- TODO
      router.push('/login')
    }
    return Promise.reject(error)
  }
)

// 定义/封装request函数 - 通用 支持get/post
// 支持类型提示
// 针对于get / post 请求 -> 统一进行传参处理
// 参数:
// url method submitData

type Data<T> = {
  code: number
  message: string
  data: T
}

const request = <T>(
  url: string,
  method: Method = 'GET',
  submitData?: object
) => {
  // return instance.request<{ name: 'jack'; age: 20 }, { name: 'jack'; age: 20 }>(
  return instance.request<T, Data<T>>({
    url,
    method,
    // 针对的get -> params / post -> data
    [method.toLowerCase() === 'get' ? 'params' : 'data']: submitData
  })
}

export { baseURL, instance, request }
